import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import register.Register;
import register.RegisterID;
import bplustree.BPlusTree;
import FilesManagers.CantOpenFileException;
import FilesManagers.FileManager;
import FilesManagers.NoMoreLinesException;
import FilesManagers.RemoteUrlManager;

import Filters.FullFilter;


/*
 *FIXME - Agregar excepciones a todo.
 * */

public class IndexManager {
	
	private String urls;
	private String bibliotecaSW;
	private String bibliotecaST;
	private FileManager manejadorUrls;
	private FullFilter filtroLinea;
	private int contadorUrls;
	//private BPlusTree arbol;
	public IndexManager(String urls, FullFilter filtro) throws CantOpenFileException{
		this.urls=urls;
		filtroLinea= filtro;
		manejadorUrls = new FileManager();
		manejadorUrls.cargarArchivo(this.urls);
		manejadorUrls.setMarcadorComentario('#');
		//this.filtroLinea= new FullFilter(bibliotecaSW,bibliotecaST);
		contadorUrls=0;
		
	}
		
		
	

	public DatosUrl devolverPalabrasSiguiente (){
		DatosUrl datosUrl = new DatosUrl();
		ArrayList<String> listaPalabras = new ArrayList<String>();
		
		String archivoTemporal="pepe.html";
		String linea="";
		
		FileManager manejadorArchivo = new FileManager();
		//FileManager manejadorUrls = new FileManager();
		
		

		try{
			//FullFilter filtroLinea = new FullFilter(bibliotecaST,bibliotecaSW);
			
			
			RemoteUrlManager urlRemota = new RemoteUrlManager();

			
			
			try{
				/*while*/if(((linea = manejadorUrls.obtenerSiguienteLinea())!=null)){
					contadorUrls++;
					System.out.println("**************************");
					System.out.println("La URL numero "+contadorUrls+" es "+linea);
					System.out.println("**************************");
					/*El primer parametro es la url remota, el segundo el nombre que le quiero poner en disco, si se deja vacio usa el mismo nombre del html remoto*/
					urlRemota.copiar(linea,archivoTemporal);

					/*Tendria que repetir este proceso por cada HTML que lea - falta stemming, contruccion de indice,etc*/
					manejadorArchivo.cargarArchivo(archivoTemporal,urlRemota.getCodificacion());
					try{
						while((linea = manejadorArchivo.obtenerSiguienteLinea())!=null){

							linea = filtroLinea.procesarLinea(linea);
							/*Por ahora solo imprimo por pantalla*/
							if(linea.trim().compareTo("")!=0){ 
								//System.out.println(linea);
								String palabras[]= linea.split(" ");
								for(int i=0; i<palabras.length;i++){
									listaPalabras.add(palabras[i]);
									//System.out.println(palabras[i]);
								}
							}
							

						}
					}catch(NoMoreLinesException e){
						System.out.println(e.getMessage());
						manejadorArchivo.cerrarArchivo();

					}
				}else{
					return null;
					
				}
			}catch(NoMoreLinesException e){
				System.out.println(e.getMessage());
				//manejadorUrls.cerrarArchivo();

			}
		}catch(CantOpenFileException e){
			System.out.println(e.getMessage());

		}

		FileManager.borrar(archivoTemporal);
		datosUrl.setItPalabras(listaPalabras.iterator());
		datosUrl.setNumeroUrl(contadorUrls);
		return datosUrl;



	}
	
	public void makeIndex(){
		
	
		//IndexManager c = new IndexManager("urls.txt","stopwords.conf","stemming.conf");
		DatosUrl datosUrl;
		while((datosUrl = this.devolverPalabrasSiguiente())!=null){
			Iterator itPalabras = datosUrl.getItPalabras();
			int numeroUrl =	datosUrl.getNumeroUrl();
			try {
				BPlusTree arbol = new BPlusTree();
				
				while(itPalabras.hasNext()){
					String p =itPalabras.next().toString();
					System.out.println("Insertando registro " +p );
					arbol.insert(new Register(new RegisterID(p),numeroUrl));
				}
				System.out.println("Finalizada insercion, comenzando listado");
				//arbol.list();
				arbol.finalize();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			
		
		
	}
	
	public void searchIndex(String objetivo){
		BPlusTree arbol;
		try {
			arbol = new BPlusTree();
			
			Register tempReg=arbol.search(new RegisterID(objetivo));
			System.out.println("Registro más proximo encontrado:");
			System.out.println("Size; ID||At1|At2|At...");
			System.out.println(tempReg.toStringList());
			
			arbol.finalize();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//return tempReg.;
		
	}
	
	



}